package systems;

import graphique.C;

import javax.media.opengl.GL;

public class L_System
{
	
	String convertible = new String("A");
	
	private String conversion( String s )
	{
		if( s.compareTo("A") == 0 )
		{
			//return "A(BA)(CA)A";
			return "A(BA)(CA)";
		}
		
		return "";
	}
	
	int niveau = 0;
	private int	niveauVoulu;

	private void effectuer(GL gl, String s)
	{
		gl.glColor3d( 0.75 , 0.5 + niveau * 0.5/(C.nNivArbre-1) , 0 );
		
		if( s.compareTo("A") == 0 )
		{
			if( niveau == niveauVoulu )
			{
				gl.glColor3d( 0 , 0.5 , 0 );
				gl.glScaled(3, 1, 1);
			}
				
			
			gl.glCallList(20);
			gl.glTranslated( 0 , 0 , 0.03 );
			//System.out.println("Call + T ");
		}
		else if( s.compareTo("B") == 0 )
		{
			gl.glRotatef( 45 , 1 , 0 , 0);
			gl.glRotatef( 45 , 0 , 1 , 0);
			//gl.glRotatef( 25 + (int)(Math.random() * 30) - 5 , 0 , 1 , 0);
			
			gl.glScaled(0.8, 0.8, 0.8);
			//System.out.println("R+ ");
		}
		else if( s.compareTo("S") == 0 )
		{
			gl.glRotatef( 90  , 0 , 0 , 1);
			gl.glScaled(0.8, 0.8, 0.8);
			//System.out.println("R+ ");
		}
		else if( s.compareTo("C") == 0 )
		{
			gl.glRotatef( -45 , 1 , 0 , 0);
			gl.glRotatef( -45 , 0 , 1 , 0);
			//gl.glRotatef( -25 -(int)(Math.random() * 30) - 5 , 0 , 1 , 0);

			gl.glScaled(0.8, 0.8, 0.8);
			//System.out.println("R- ");
		}
		else if( s.compareTo("D") == 0 )
		{
			gl.glRotatef( 25 + (int)(Math.random() * 30) - 5 , 1 , 0 , 0);
			//gl.glRotatef( 45 + (int)(Math.random() * 10) - 5 , 0 , 0 , 1);
			
			gl.glScaled(0.8, 0.8, 0.8);
			//System.out.println("R+ ");
		}
		else if( s.compareTo("E") == 0 )
		{
			gl.glRotatef( 25 + (int)(Math.random() * 30) - 5 , 1 , 0 , 0);
			//gl.glRotatef( -45+ (int)(Math.random() * 10) - 5 , 0 , 0 , 1);
			gl.glScaled(0.8, 0.8, 0.8);
			//System.out.println("R- ");
		}
		else if( s.compareTo("(") == 0 )
		{
			gl.glPushMatrix();
			niveau++;
			//System.out.println("Push ");
		}
		else if( s.compareTo(")") == 0 )
		{
			gl.glPopMatrix();
			niveau--;
			//System.out.println("Pop ");
		}
	}
	
	public String developpment( String s , int niveau )
	{
		String actuel = s;
		String neww;
		String eval;
		
		niveauVoulu = niveau;
		
		for( int i = 0 ; i < niveau ; i++ )
		{
			neww = "";
			
			for( int j = 0 ; j < actuel.length() ; j++ )
			{
				eval = actuel.substring(j, j+1 );
				
				if( convertible.contains(eval) )
				{
					neww += conversion( eval );
				}
				else
				{
					neww += eval;
				}
			}
			
			actuel = neww;
		}
		
		return actuel;
	}
	
	public void construction( GL gl , String s )
	{
		//System.out.println("Debut Sec");
		for( int j = 0 ; j < s.length() ; j++ )
		{
			effectuer( gl , s.substring(j, j+1 ) );
		}
		//System.out.println("Fin Sec\n\n");
	}
	
}
